home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Gekkan Dennou Club 142
/
Gekkan Dennou Club - 2000.3 Vol. 142 (Japan).7z
/
Gekkan Dennou Club - 2000.3 Vol. 142 (Japan) (Track 1).bin
/
tools
/
s44play
/
s44p101s.lzh
/
param.s
< prev
next >
Wrap
Text File
|
2000-01-24
|
49KB
|
1,939 lines
.include global.mac
;----------------------------------------------------------------
;コマンドラインのパラメータを解析する
;<a0.l:コマンドラインの先頭
;>d0.l:負数=エラー
;>n-flag:mi=エラー
.text
.align 4,$2048
get_params::
movem.l d1-d7/a0-a6,-(sp)
movea.l a0,a5 ;コマンドライン
;環境変数CDROMの内容を取得する
; 環境変数の内容は.fmpファイルに出力するので,CD-ROMドライブを使わなくても必要
lea.l cdrom_env_work,a0
lea.l (cdrom_env_name,pc),a1
bsr getenv
tst.b (a0)
beq 2f
bsr stou
bcs 2f
move.l d0,d1
bsr get_max_scsiid
cmp.l d0,d1
bhi 2f
move.l d1,env_scsiid
2:
;パラメータバッファを初期化する
lea.l param_buf,a2
move.w #(param_buf_end-param_buf)/4-1,d1
moveq.l #0,d0
1: move.l d0,(a2)+
dbra d1,1b
lea.l param_buf,a2
;環境変数S44PLAYを解釈する
lea.l param_env_work,a0
lea.l (param_env_name,pc),a1
bsr getenv
tst.b (a0)
beq @f
movea.l a0,a1
lea.l param_copy1,a0
bsr get_params_sub
bmi 99f
@@:
;コマンドラインを解釈する
movea.l a5,a1 ;コマンドライン
lea.l param_copy2,a0
bsr get_params_sub
bmi 99f
move.l #-1,(a2)+ ;パラメータの終わり
tst.l scsiid
bpl 2f
lea.l cdrom_env_work,a0
tst.b (a0)
beq 2f
bsr stou
bcs 2f
move.l d0,d1
bsr get_max_scsiid
cmp.l d0,d1
bhi 2f
move.b (a0)+,d0
beq 1f
cmp.b #',',d0
bne 1f
bsr stou
bcs 1f
cmp.l #7,d0
bhi 1f
swap.w d1
move.w d0,d1
swap.w d1
1: move.l d1,env_scsiid ;ID,LUN
2:
tst.l param_scsiid
bpl 1f
move.l env_scsiid,d0
bmi 2f
move.l d0,param_scsiid
1:
2:
tst.b list_flag
beq 1f
;-l
;scsiidを設定した後に行うこと
tst.l param_buf+pb_ptr ;-lはファイル名やトラック番号と共存できない
bpl 83f
tst.b conv_flag ;-lは-cと共存できない
bne 83f
bsr do_list
bra 90f ;必ずエラー終了させる
1:
tst.b conv_flag
beq 1f
;-c<filename>
;scsiidを設定した後に行うこと
;-cはファイル名やトラック番号と共存する
tst.b list_flag ;-cは-lと共存できない
bne 83f
bsr do_conv
bra 90f ;必ずエラー終了させる
1:
;-lを処理した後に行うこと
tst.l param_buf+pb_ptr
bmi 88f
moveq.l #0,d0
99: movem.l (sp)+,d1-d7/a0-a6
rts
80: move.w #EXIT_SCSIID_MISSING,exit_code
lea.l (m_id_not_specified,pc),a0
bra 89f
81: move.w #EXIT_ILLEGAL_ENV_CDROM,exit_code
lea.l (m_illegal_cdrom_env,pc),a0
.if 0
bra 89f
82: move.w #EXIT_DENY_68000,exit_code
lea.l (m_deny_68000,pc),a0
.endif
bra 89f
89: bsr print_banner
bsr eaprintcrlf
bra 90f
83: move.w #EXIT_CONFLICT_PARAM,exit_code
bra 87f
88: move.w #EXIT_MISSING_PARAM,exit_code
87: bsr print_banner
bsr print_usage
90: moveq.l #-1,d0
bra 99b
m_id_not_specified: .dc.b 'SCSI-ID が指定されていません',0
m_illegal_cdrom_env: .dc.b '環境変数 CDROM の内容が異常です',0
.if 0
m_deny_68000: .dc.b '68000 では -onmem を指定しなければ処理が間に合いません',0
.endif
.even
;----------------------------------------------------------------
;パラメータを解析する
;<a0.l:バッファの先頭
;<a1.l:文字列の先頭
;<a2.l:パラメータのバッファ
.text
.align 4,$2048
get_params_sub:
;パラメータの文字列を分解する
movea.l a0,a3
movea.l a1,a4
10: movea.l a3,a0
movea.l a4,a1
bsr getword
movea.l a1,a4
bmi 98f ;文字列がない
beq 10b ;""
;<d0.l:コピーしたワードの長さ
;<a0.l:バッファの先頭
;<a1.l:文字列の先頭のワードの直後
move.b (a0),d0
cmp.b #'-',d0
bne 20f ;'-'以外で始まっている
move.b (1,a0),d0
beq 20f ;'-'のみなので標準入力(ファイル名と同じ)
addq.l #1,a0
bsr tolower
cmp.b #'c',d0
bne 9f
addq.l #1,a0
;-c<filename>
tst.b (a0)
bne 1f
movea.l a3,a0
movea.l a4,a1
bsr getword
movea.l a1,a4
bmi 87f ;文字列がない
beq 87f ;""
1: st.b conv_flag
lea.l (str_hyphen,pc),a1 ;'-'は標準出力
bsr strcmp
bne 2f
clr.l output_filename_ptr ;標準出力のときは0
bra 10b
2: move.l a0,output_filename_ptr ;標準出力でなければファイル名へのポインタ
moveq.l #'.',d0
bsr strrchr
bpl 3f ;'.'がある
lea.l (str_dot_fmp,pc),a1 ;'.'がないときは'.fmp'を追加する
bsr strcat
bra 4f
3: bsr strchr0
4: lea.l (1,a0),a3
bra 10b
9: cmp.b #'v',d0
bne 9f
addq.l #1,a0
bsr stou
bcs 8f ;-vで始まるスイッチが他にあるかも知れないので,
;-vの直後が数字でなくてもエラーにしない
;-v<n>
tst.b (a0)
bne 83f
tst.l d0
beq 84f
cmp.l #MAX_VOLUME,d0
bhi 84f
move.l d0,volume
bra 10b
8: lea.l (1,a3),a0
9: cmp.b #'b',d0
bne 9f
addq.l #1,a0
bsr stou
bcs 8f ;-bで始まるスイッチが他にあるかも知れないので,
;-bの直後が数字でなくてもエラーにしない
;-b<n>
tst.b (a0)
bne 85f
tst.l d0
beq 86f
cmp.l #MAX_BUFUNT,d0
bhi 86f
move.l d0,param_bufunt
bra 10b
8: lea.l (1,a3),a0
9: cmp.b #'z',d0
bne 9f
addq.l #1,a0
bsr stou
bcs 8f ;-zで始まるスイッチが他にあるかも知れないので,
;-zの直後が数字でなくてもエラーにしない
.if 0
;-z<n>
tst.b (a0)
bne 75f
tst.l d0
beq 76f ;0は指定できない
cmp.l #MAX_LOWER_LIMIT,d0
bhi 76f
move.l d0,lower_limit
.endif
bra 10b
8: lea.l (1,a3),a0
9: cmp.b #'l',d0
bne 9f
tst.b (1,a0) ;-loopなどがヒットしないようにする
bne 9f
;-l
st.b list_flag
bra 10b
9: lea.l (str_bass,pc),a1
bsr stricmp
bne 9f
;-bass
st.b bass_flag
sf.b hicut_flag
bra 10b
9: lea.l (str_hicut,pc),a1
bsr stricmp
bne 9f
;-hicut
sf.b bass_flag
st.b hicut_flag
bra 10b
9: lea.l (str_stereo,pc),a1
bsr stricmp
bne 9f
;-stereo
sf.b mono_flag
bra 10b
9: lea.l (str_mono,pc),a1
bsr stricmp
bne 9f
;-mono
st.b mono_flag
bra 10b
9: lea.l (str_fi,pc),a1
moveq.l #2,d0
bsr strnicmp
bne 9f
;-fi[[=]<n>]
moveq.l #DEFAULT_FADEIN_SPEED,d0
tst.b (a0)
beq 3f
cmpi.b #'=',(a0)
beq 1f
bsr stou
bcs 8f
bra 2f
1: addq.l #1,a0
bsr stou
bcs 77f
2: beq 78f
cmp.l #31,d0
bhi 78f
3: move.b d0,fadein_speed
tst.b (a0)
bne 77f
bra 10b
8: lea.l (1,a3),a0
9: lea.l (str_fo,pc),a1
moveq.l #2,d0
bsr strnicmp
bne 9f
;-fo[=]<n>
cmpi.b #'=',(a0)
beq 1f
tst.b (a0)
beq 73f
bsr stou
bcs 8f
bra 2f
1: addq.l #1,a0
bsr stou
bcs 73f
2: beq 74f
cmp.l #31,d0
bhi 74f
move.b d0,fadeout_speed
tst.b (a0)
bne 73f
bra 10b
8: lea.l (1,a3),a0
9: lea.l (str_silent,pc),a1
bsr stricmp
bne 9f
;-silent
st.b silent_flag
bra 10b
9: lea.l (str_weigh,pc),a1
bsr stricmp
bne 9f
;-weigh
.if 0
st.b weigh_flag
.endif
bra 10b
9: lea.l (str_reverse,pc),a1
bsr stricmp
bne 9f
;-reverse
.if 0
st.b reverse_flag
.endif
bra 10b
9: lea.l (str_drama,pc),a1
bsr stricmp
bne 9f
;-drama
.if 0
st.b drama_flag
.endif
bra 10b
9: lea.l (str_hard,pc),a1
bsr stricmp
bne 9f
;-hard
clr.b hard_soft
bra 10b
9: lea.l (str_soft,pc),a1
bsr stricmp
bne 9f
;-soft
move.b #1,hard_soft
bra 10b
9: lea.l (str_force,pc),a1
bsr stricmp
bne 9f
;-force
st.b force_flag
bra 10b
9: lea.l (str_tdpause,pc),a1
bsr stricmp
bne 9f
;-tdpause
st.b tdpause_flag
bra 10b
9: lea.l (str_onmem,pc),a1
bsr stricmp
bne 9f
;-onmem
st.b onmem_flag
bra 10b
9: lea.l (str_preconv,pc),a1
bsr stricmp
bne 9f
;-preconv
bra 10b ;無視
9: lea.l (str_himem,pc),a1
bsr stricmp
bne 9f
;-himem
st.b himem_flag
bra 10b
9: lea.l (str_sony,pc),a1
bsr stricmp
bne 9f
;-sony
move.b #SONY,cdrom_type
bra 10b
9: lea.l (str_toshiba,pc),a1
bsr stricmp
bne 9f
;-toshiba
move.b #TOSHIBA,cdrom_type
bra 10b
9: lea.l (str_m16,pc),a1
bsr stricmp
bne 9f
;-m16
move.w #MS16B,param_file_format
move.l #16000,param_file_frequency
bra 10b
9: lea.l (str_m19,pc),a1
bsr stricmp
bne 9f
;-m19
move.w #MS16B,param_file_format
move.l #18900,param_file_frequency
bra 10b
9: lea.l (str_m22,pc),a1
bsr stricmp
bne 9f
;-m22
move.w #MS16B,param_file_format
move.l #22050,param_file_frequency
bra 10b
9: lea.l (str_m24,pc),a1
bsr stricmp
bne 9f
;-m24
move.w #MS16B,param_file_format
move.l #24000,param_file_frequency
bra 10b
9: lea.l (str_m32,pc),a1
bsr stricmp
bne 9f
;-m32
move.w #MS16B,param_file_format
move.l #32000,param_file_frequency
bra 10b
9: lea.l (str_m38,pc),a1
bsr stricmp
bne 9f
;-m38
move.w #MS16B,param_file_format
move.l #37800,param_file_frequency
bra 10b
9: lea.l (str_m44,pc),a1
bsr stricmp
bne 9f
;-m44
move.w #MS16B,param_file_format
move.l #44100,param_file_frequency
bra 10b
9: lea.l (str_m48,pc),a1
bsr stricmp
bne 9f
;-m48
move.w #MS16B,param_file_format
move.l #48000,param_file_frequency
bra 10b
9: lea.l (str_s16,pc),a1
bsr stricmp
bne 9f
;-s16
move.w #SS16B,param_file_format
move.l #16000,param_file_frequency
bra 10b
9: lea.l (str_s19,pc),a1
bsr stricmp
bne 9f
;-s19
move.w #SS16B,param_file_format
move.l #18900,param_file_frequency
bra 10b
9: lea.l (str_s22,pc),a1
bsr stricmp
bne 9f
;-s22
move.w #SS16B,param_file_format
move.l #22050,param_file_frequency
bra 10b
9: lea.l (str_s24,pc),a1
bsr stricmp
bne 9f
;-s24
move.w #SS16B,param_file_format
move.l #24000,param_file_frequency
bra 10b
9: lea.l (str_s32,pc),a1
bsr stricmp
bne 9f
;-s32
move.w #SS16B,param_file_format
move.l #32000,param_file_frequency
bra 10b
9: lea.l (str_s38,pc),a1
bsr stricmp
bne 9f
;-s38
move.w #SS16B,param_file_format
move.l #37800,param_file_frequency
bra 10b
9: lea.l (str_s44,pc),a1
bsr stricmp
bne 9f
;-s44
move.w #SS16B,param_file_format
move.l #44100,param_file_frequency
bra 10b
9: lea.l (str_s48,pc),a1
bsr stricmp
bne 9f
;-s48
move.w #SS16B,param_file_format
move.l #48000,param_file_frequency
bra 10b
9: lea.l (str_pcm,pc),a1
bsr stricmp
bne 9f
;-pcm
move.w #ADPCM,param_file_format
move.l #15625,param_file_frequency
bra 10b
9: lea.l (str_p16,pc),a1
bsr stricmp
bne 9f
;-p16
move.w #MS16B,param_file_format
move.l #15625,param_file_frequency
bra 10b
9: lea.l (str_loop,pc),a1
bsr stricmp
bne 9f
;-loop
st.b loop_flag
bra 10b
9: lea.l (str_extra,pc),a1
bsr stricmp
bne 9f
;-extra
st.b extra_flag
bra 10b
9: lea.l (str_lq,pc),a1
bsr stricmp
bne 9f
;-lq
move.b #LOW_QUALITY,quality_level
bra 10b
9: lea.l (str_hq,pc),a1
bsr stricmp
bne 9f
;-hq
move.b #HIGH_QUALITY,quality_level
bra 10b
9: lea.l (str_sq,pc),a1
bsr stricmp
bne 9f
;-sq
move.b #SUPER_QUALITY,quality_level
bra 10b
9: lea.l (str_int,pc),a1
moveq.l #3,d0
bsr strnicmp
bne 9f
;-int[=]<n>
cmpi.b #'=',(a0)
beq 1f
tst.b (a0)
beq 68f
bsr stou
bcs 8f
bra 2f
1: addq.l #1,a0
bsr stou
bcs 68f
2: cmp.l #MIN_INT,d0
blo 69f
cmp.l #MAX_INT,d0
bhi 69f
move.b d0,output_timerd_count
tst.b (a0)
bne 68f
bra 10b
8: lea.l (1,a3),a0
9: lea.l (str_id,pc),a1
moveq.l #2,d0
bsr strnicmp
bne 9f
;-id[=]ID[,LUN]
cmpi.b #'=',(a0)
beq 1f
bsr stou
bcs 8f
bra 2f
1: addq.l #1,a0
bsr stou
bcs 80f
2: move.l d0,d1
bsr get_max_scsiid
cmp.l d0,d1
bhi 80f
move.l d1,param_scsiid ;SCSI-ID
cmpi.b #',',(a0)
bne 3f
addq.l #1,a0
bsr stou
bcs 80f
cmp.l #7,d0
bhi 80f
move.w d0,param_scsiid ;LUN
3: tst.b (a0)
bne 80f
bra 10b
8: lea.l (1,a3),a0
9: lea.l (str_mac,pc),a1
moveq.l #3,d0
bsr strnicmp
bne 9f
;-mac[N1[,N2…]]
moveq.l #-1,d1
tst.b (a0)
beq 3f
moveq.l #0,d1
1: bsr stou
bcs 70f
cmp.l #8,d0
bcc 70f
bset.l d0,d1
cmpi.b #',',(a0)+
beq 1b
tst.b -(a0)
bne 70f
2: moveq.l #%11110110,d0
and.b d1,d0
bne 70f
3: move.b d1,mac_select
bra 10b
9: lea.l (str_mpu,pc),a1
moveq.l #3,d0
bsr strnicmp
bne 9f
;-mpu[N1[,N2…]]
moveq.l #-1,d1
tst.b (a0)
beq 3f
moveq.l #0,d1
1: bsr stou
bcs 71f
cmp.l #8,d0
bcc 71f
bset.l d0,d1
cmpi.b #',',(a0)+
beq 1b
tst.b -(a0)
bne 71f
2: moveq.l #%10100000,d0
and.b d1,d0
bne 71f
3: move.b d1,mpu_select
bra 10b
9: lea.l (str_normal,pc),a1
bsr stricmp
bne 9f
;-normal
move.w #NORMAL_SPEED,cdrom_speed
bra 10b
9: lea.l (str_fast,pc),a1
bsr stricmp
bne 9f
;-fast
move.w #FAST_SPEED,cdrom_speed
bra 10b
9: lea.l (str_ultra,pc),a1
bsr stricmp
bne 9f
;-ultra
move.w #ULTRA_SPEED,cdrom_speed
bra 10b
9: lea.l (str_tl,pc),a1
moveq.l #2,d0
bsr strnicmp
bne 9f
bsr stou
bcs 8f
;-tl<n>
.if 0
tst.b (a0)
bne 81f
cmp.l #TL_LOWER_LIMIT,d0
blo 82f
cmp.l #TL_UPPER_LIMIT,d0
bhi 82f
move.b d0,max_tl
.endif
bra 10b
8: lea.l (1,a3),a0
.if TEST_DEBUG_SWITCH
9: lea.l (str_debug,pc),a1
bsr stricmp
bne 9f
;-debug
st.b debug_flag
bra 10b
9: lea.l (str_debugp,pc),a1
moveq.l #6,d0
bsr strnicmp
bne 9f
;-debugp[=]<n>
cmpi.b #'=',(a0)
beq 1f
tst.b (a0)
beq 88f
bsr stou
bcs 8f
bra 2f
1: addq.l #1,a0
bsr stou
bcs 88f
2: beq 88f
move.l d0,debugp
tst.b (a0)
bne 88f
bra 10b
8: lea.l (1,a3),a0
9: lea.l (str_debugb,pc),a1
moveq.l #6,d0
bsr strnicmp
bne 9f
;-debugb[=]<n>
cmpi.b #'=',(a0)
beq 1f
tst.b (a0)
beq 88f
bsr stou
bcs 8f
bra 2f
1: addq.l #1,a0
bsr stou
bcs 88f
2: beq 88f
move.l d0,debugb
tst.b (a0)
bne 88f
bra 10b
8: lea.l (1,a3),a0
9: lea.l (str_debugm,pc),a1
moveq.l #6,d0
bsr strnicmp
bne 9f
;-debugm[=]<n>
cmpi.b #'=',(a0)
beq 1f
tst.b (a0)
beq 88f
bsr stou
bcs 8f
bra 2f
1: addq.l #1,a0
bsr stou
bcs 88f
2: beq 88f
move.l d0,debugm
tst.b (a0)
bne 88f
bra 10b
8: lea.l (1,a3),a0
9: lea.l (str_debugs,pc),a1
moveq.l #6,d0
bsr strnicmp
bne 9f
;-debugs[=]<n>
cmpi.b #'=',(a0)
beq 1f
tst.b (a0)
beq 88f
bsr stou
bcs 8f
bra 2f
1: addq.l #1,a0
bsr stou
bcs 88f
2: beq 88f
move.l d0,debugs
tst.b (a0)
bne 88f
bra 10b
8: lea.l (1,a3),a0
.endif
9: lea.l (str_xx,pc),a1
moveq.l #2,d0
bsr strnicmp
bne 9f
;-xx
tst.b (a0)
bne @f
moveq.l #-1,d0
move.w d0,param_file_format
move.l d0,param_file_frequency
bra 10b
@@: bsr stou
bcs 8f
moveq.l #MXX4,d1
subq.l #1,d0
blo 8f
beq @f
subq.l #1,d0
bne 8f
moveq.l #SXX4,d1
@@: cmpi.b #',',(a0)+
bne 8f
bsr stou
bcs 8f
cmp.l #MXX4,d1
bne 1f
cmp.l #MIN_FREQUENCY_MONO,d0
blo 8f
cmp.l #MAX_FREQUENCY_MONO,d0
bhi 8f
bra 2f
1: cmp.l #MIN_FREQUENCY_STEREO,d0
blo 8f
cmp.l #MAX_FREQUENCY_STEREO,d0
bhi 8f
2: cmpi.b #',',(a0)+
bne 8f
move.w d1,param_file_format
move.l d0,param_file_frequency
lea.l xx_table,a1
moveq.l #32-1,d1
1: bsr stou
bcs 2f
* cmp.l #127,d0
* bhi 8f
move.w d0,(a1)+
cmpi.b #',',(a0)+
dbne d1,1b
subq.l #1,a0
2:
* tst.b (a0)
* bne 8f
bra 10b
8: lea.l (1,a3),a0
9:
.if 0 ;標準入力'-'に範囲を指定できなくなるので削除
move.l a0,-(sp)
bsr stou
movea.l (sp)+,a0
bcs 88f ;'-'で始まっているファイル名は受け付けない
.endif
subq.l #1,a0
;'-'だけか'-'以外で始まっている
20:
move.b current_machine_map,d0
and.b mac_select,d0
beq 10b
move.b current_mpu_map,d0
and.b mpu_select,d0
beq 10b
lea.l (str_all,pc),a1
bsr stricmp
bne 9f
;ALL
cmp.l #param_buf_end,a2
bcc 72f
move.l a3,(pb_ptr,a2) ;NULLへのポインタ
sf.b (a3)+
clr.l (pb_rangetype,a2) ;範囲指定なし
move.l #$80000000,(pb_trktop_0,a2) ;開始トラック
move.l #$7FFFFFFF,(pb_trkbtm_0,a2) ;終了トラック
move.l #$80000000,(pb_idxtop_0,a2) ;開始インデックス
move.l #$7FFFFFFF,(pb_idxbtm_0,a2) ;終了インデックス
move.l #$80000000,(pb_top_0,a2) ;開始位置
move.l #$7FFFFFFF,(pb_btm_0,a2) ;終了位置
lea.l (pb_size,a2),a2
bra 10b
9:
;'-'だけかファイル名かトラック番号
;','による分解を行う
31: moveq.l #',',d0
bsr strchr
move.l d0,d7
bmi @f
lea.l (a0,d0.l),a1
sf.b (a1)+
move.l a1,d7
@@:
tst.b (a0)
beq 39f
cmp.l #param_buf_end,a2
bcc 72f
movem.l d1-d6,-(sp)
bsr get_suffix_range_trkidx
movem.l d1-d6,(pb_trktop_0,a2)
movem.l (sp)+,d1-d6
bmi 67f ;範囲指定が不正
move.l d0,(pb_rangetype,a2)
move.l a3,(pb_ptr,a2)
move.w param_file_format,(pb_format,a2)
move.l param_file_frequency,(pb_frequency,a2)
lea.l (pb_size,a2),a2
movea.l a3,a0
bsr strchr0
lea.l (1,a0),a3
39: movea.l d7,a0
tst.l d7
bpl 31b
bra 10b
98: moveq.l #0,d0
99: rts
67: move.w #EXIT_ILLEGAL_RANGE,exit_code
lea.l (m_illegal_range,pc),a0
bra 89f
80: move.w #EXIT_ILLEGAL_ID,exit_code
lea.l (m_illegal_id,pc),a0
.if 0
bra 89f
81: move.w #EXIT_ILLEGAL_TL,exit_code
lea.l (m_illegal_tl,pc),a0
bra 89f
82: move.w #EXIT_OUTSIDE_TL,exit_code
lea.l (m_outside_tl,pc),a0
bra 89f
.endif
83: move.w #EXIT_ILLEGAL_V,exit_code
lea.l (m_illegal_v,pc),a0
bra 89f
84: move.w #EXIT_OUTSIDE_V,exit_code
lea.l (m_outside_v,pc),a0
bra 89f
85: move.w #EXIT_ILLEGAL_B,exit_code
lea.l (m_illegal_b,pc),a0
bra 89f
86: move.w #EXIT_OUTSIDE_B,exit_code
lea.l (m_outside_b,pc),a0
.if 0
bra 89f
75: move.w #EXIT_ILLEGAL_Z,exit_code
lea.l (m_illegal_z,pc),a0
bra 89f
76: move.w #EXIT_OUTSIDE_Z,exit_code
lea.l (m_outside_z,pc),a0
.endif
bra 89f
77: move.w #EXIT_ILLEGAL_FI,exit_code
lea.l (m_illegal_fi,pc),a0
bra 89f
78: move.w #EXIT_OUTSIDE_FI,exit_code
lea.l (m_outside_fi,pc),a0
bra 89f
73: move.w #EXIT_ILLEGAL_FO,exit_code
lea.l (m_illegal_fo,pc),a0
bra 89f
74: move.w #EXIT_OUTSIDE_FO,exit_code
lea.l (m_outside_fo,pc),a0
bra 89f
68: move.w #EXIT_ILLEGAL_INT,exit_code
lea.l (m_illegal_int,pc),a0
bra 89f
69: move.w #EXIT_OUTSIDE_INT,exit_code
lea.l (m_outside_int,pc),a0
bra 89f
72: move.w #EXIT_TOO_MANY_PARAMS,exit_code
lea.l (m_too_many_params,pc),a0
bra 89f
70: move.w #EXIT_ILLEGAL_MAC,exit_code
lea.l (m_illegal_mac,pc),a0
bra 89f
71: move.w #EXIT_ILLEGAL_MPU,exit_code
lea.l (m_illegal_mpu,pc),a0
bra 89f
87: move.w #EXIT_OBJECT_FILENAME,exit_code
lea.l (m_object_filename,pc),a0
89: bsr print_banner
bsr eaprintcrlf
bra 90f
88: move.w #EXIT_UNKNOWN_SWITCH,exit_code
bsr print_banner
bsr print_usage
90: moveq.l #-1,d0
rts
param_env_name:: .dc.b PROGNAME,0
cdrom_env_name:: .dc.b 'CDROM',0
str_bass: .dc.b 'bass',0
str_hicut: .dc.b 'hicut',0
str_stereo: .dc.b 'stereo',0
str_mono: .dc.b 'mono',0
str_fi: .dc.b 'fi',0
str_fo: .dc.b 'fo',0
str_silent: .dc.b 'silent',0
str_weigh: .dc.b 'weigh',0
str_zerosp: .dc.b 'zerosp',0
str_reverse: .dc.b 'reverse',0
str_drama: .dc.b 'drama',0
str_hard: .dc.b 'hard',0
str_soft: .dc.b 'soft',0
str_force: .dc.b 'force',0
str_tdpause: .dc.b 'tdpause',0
str_onmem: .dc.b 'onmem',0
str_preconv: .dc.b 'preconv',0
str_himem: .dc.b 'himem',0
str_sony: .dc.b 'sony',0
str_toshiba: .dc.b 'toshiba',0
str_m16: .dc.b 'm16',0
str_m19: .dc.b 'm19',0
str_m22: .dc.b 'm22',0
str_m24: .dc.b 'm24',0
str_m32: .dc.b 'm32',0
str_m38: .dc.b 'm38',0
str_m44: .dc.b 'm44',0
str_m48: .dc.b 'm48',0
str_s16: .dc.b 's16',0
str_s19: .dc.b 's19',0
str_s22: .dc.b 's22',0
str_s24: .dc.b 's24',0
str_s32: .dc.b 's32',0
str_s38: .dc.b 's38',0
str_s44: .dc.b 's44',0
str_s48: .dc.b 's48',0
str_pcm: .dc.b 'pcm',0
str_p16: .dc.b 'p16',0
str_loop: .dc.b 'loop',0
str_extra: .dc.b 'extra',0
str_lq: .dc.b 'lq',0
str_hq: .dc.b 'hq',0
str_sq: .dc.b 'sq',0
str_int: .dc.b 'int',0
str_id: .dc.b 'id',0
str_mac: .dc.b 'mac',0
str_mpu: .dc.b 'mpu',0
str_normal: .dc.b 'normal',0
str_fast: .dc.b 'fast',0
str_ultra: .dc.b 'ultra',0
str_tl: .dc.b 'tl',0
.if TEST_DEBUG_SWITCH
str_debug: .dc.b 'debug',0
str_debugp: .dc.b 'debugp',0
str_debugb: .dc.b 'debugb',0
str_debugm: .dc.b 'debugm',0
str_debugs: .dc.b 'debugs',0
.endif
str_xx: .dc.b 'xx',0
str_all: .dc.b 'all',0
str_hyphen: .dc.b '-',0
str_dot_fmp: .dc.b '.fmp',0
m_illegal_range: .dc.b '再生範囲の範囲指定が間違っています',0
m_illegal_id: .dc.b 'SCSI-ID の指定 (-id) が異常です',0
.if 0
m_illegal_tl: .dc.b 'トータルレベルの指定 (-tl) が異常です',0
m_outside_tl: .dc.b 'トータルレベルの指定 (-tl) が範囲外です',0
.endif
m_illegal_v: .dc.b 'ボリュームの指定 (-v) が異常です',0
m_outside_v: .dc.b 'ボリュームの指定 (-v) が範囲外です',0
m_illegal_b: .dc.b 'バッファサイズの指定 (-b) が異常です',0
m_outside_b: .dc.b 'バッファサイズの指定 (-b) が範囲外です',0
.if 0
m_illegal_z: .dc.b '発声下限レベルの指定 (-z) が異常です',0
m_outside_z: .dc.b '発声下限レベルの指定 (-z) が範囲外です',0
.endif
m_illegal_fi: .dc.b 'フェードイン速度の指定 (-fi) が異常です',0
m_outside_fi: .dc.b 'フェードイン速度の指定 (-fi) が範囲外です',0
m_illegal_fo: .dc.b 'フェードアウト速度の指定 (-fo) が異常です',0
m_outside_fo: .dc.b 'フェードアウト速度の指定 (-fo) が範囲外です',0
m_illegal_int: .dc.b '再生周波数の指定 (-int) が異常です',0
m_outside_int: .dc.b '再生周波数の指定 (-int) が範囲外です',0
m_too_many_params: .dc.b '引数が多すぎます',0
m_object_filename: .dc.b 'オブジェクトファイル名の指定 (-c) が異常です',0
m_illegal_mac: .dc.b '機種の指定 (-mac) が異常です',0
m_illegal_mpu: .dc.b 'MPU の指定 (-mpu) が異常です',0
.even
.data
.even
param_file_format: .dc.w -1 ;ファイルのフォーマット
; -1 指定なし
; 0 SS16B(ステレオ,Signed-16bit,Big-endian)
; 1 MS16B(モノラル,Signed-16bit,Big-endian)
.align 4
param_file_frequency: .dc.l -1 ;ファイルのサンプリング周波数
.align 4
param_bufunt:: .dc.l -1
volume:: .dc.l DEFAULT_VOLUME
.if 0
.align 4
lower_limit: .dc.l -1 ;発声下限レベル(指定なし)
.endif
.align 4
env_scsiid: .dc.l -1 ;lun,id
param_scsiid:: .dc.l -1 ;lun,id
bass_flag:: .dc.b 0 ;-1=バスブースターを使用する
hicut_flag:: .dc.b 0 ;-1=ハイカットフィルタを使用する
mono_flag:: .dc.b 0 ;-1=モノラル再生
silent_flag:: .dc.b 0 ;-1=サイレントモード(メッセージを抑制)
.if 0
weigh_flag: .dc.b 0 ;-1=音圧制御
.endif
.if 0
reverse_flag: .dc.b 0 ;-1=リバースモード
.endif
.if 0
drama_flag: .dc.b 0 ;-1=ドラマモード
.endif
hard_soft:: .dc.b 1 ;-1=設定なし,0=ハード転送,1=ソフト転送
force_flag:: .dc.b 0 ;-1=Medium Errorがあっても再生を続行する
tdpause_flag:: .dc.b -1 ;-1=TIMER-DをHumanから奪う
onmem_flag:: .dc.b 0 ;-1=バッファ1つでオンメモリ動作
himem_flag:: .dc.b -1 ;-1=ハイメモリを使う
loop_flag:: .dc.b 0 ;-1=ループ再生
extra_flag:: .dc.b 0 ;-1=extraモード
list_flag:: .dc.b 0 ;-1=CDのトラックの一覧表示
conv_flag:: .dc.b 0 ;-1=.fmpファイルへの変換
fadein_speed:: .dc.b DEFAULT_ATTACK_RATE ;フェードイン速度(1~31,大きいほど速い)
fadeout_speed:: .dc.b DEFAULT_FADEOUT_SPEED ;フェードアウト速度(0~31,大きいほど速い)
mac_select: .dc.b -1 ;ファイルを再生する機種の選択
mpu_select: .dc.b -1 ;ファイルを再生するMPUの選択
.if 0
max_tl: .dc.b MAX_TL
.endif
quality_level:: .dc.b -1 ;再生品質
; -1=指定なし
; 0=サンプリング周波数の変換は重複・間引き
; 1=サンプリング周波数の変換は直線補間
; 2=サンプリング周波数の変換は面積補間
output_timerd_count:: .dc.b -1 ;TIMERDのカウント
.even
cdrom_speed:: .dc.w -1 ;CD-ROMの転送速度
; -1=指定なし,0=normal,1=fast,255=ultra
.align 4
output_filename_ptr:: .dc.l 0
.bss
;パラメータのバッファ
; +0.w +2.w +4.l +8.l type
; 0 format 0 frequency -
; 0 format ptr frequency ファイル名
; 1 0 N N N
; 1 0 N -1 N-
; 1 0 0 N -N
; 1 0 N1 N2 N1-N2
; 1 0 0 -1 all
;*** 2 0 msf -1 msf[-]
;*** 2 0 msf1 msf2 msf1-msf2
;*** 2 n msf -1 n/msf[-]
;*** 2 n msf1 msf2 n/msf1-msf2
; -1 -1 0 0 パラメータの終わり
.align 4
param_buf:: .ds.b pb_size*MAX_PARAMS
param_buf_end: .ds.b pb_size
.align 4
current_param_ptr:: .ds.l 1 ;現在のパラメータバッファを指すポインタ
next_param_ptr:: .ds.l 1 ;次のパラメータバッファを指すポインタ
param_copy1: .ds.b 1024 ;環境変数を分解したもの
param_copy2: .ds.b 1024 ;コマンドラインを分解したもの
param_env_work:: .ds.b 1024
cdrom_env_work:: .ds.b 1024
;----------------------------------------------------------------
;----------------------------------------------------------------
;1フレームあたりの秒数
; CDDA
; 44.1kHz(stereo,16bit) 1/75秒
; XA
; 37.8kHz(stereo,4bit) 4/75秒
; 37.8kHz(mono,4bit) 8/75秒
; 18.9kHz(stereo,4bit) 8/75秒
; 18.9kHz(mono,4bit) 16/75秒
;16/75秒あたりのフレーム数
; CDDA
; 44.1kHz(stereo,16bit) 16フレーム
; XA
; 37.8kHz(stereo,4bit) 4フレーム
; 37.8kHz(mono,4bit) 2フレーム
; 18.9kHz(stereo,4bit) 2フレーム
; 18.9kHz(mono,4bit) 1フレーム
;1秒あたりのフレーム数
; CDDA
; 44.1kHz(stereo,16bit) 75フレーム
; XA
; 37.8kHz(stereo,4bit) 75/4フレーム
; 37.8kHz(mono,4bit) 75/8フレーム
; 18.9kHz(stereo,4bit) 75/8フレーム
; 18.9kHz(mono,4bit) 75/16フレーム
;16秒あたりのフレーム数
; CDDA
; 44.1kHz(stereo,16bit) 1200フレーム
; XA
; 37.8kHz(stereo,4bit) 300フレーム
; 37.8kHz(mono,4bit) 150フレーム
; 18.9kHz(stereo,4bit) 150フレーム
; 18.9kHz(mono,4bit) 75フレーム
;----------------------------------------------------------------
;文字列の末尾から<trk>.<idx>と<ofs>または<msf>の範囲を読み取って文字列から切り捨てる
; [~/]<trk>/<ofs>[-]
; [~/]<trk>/<ofs>-<ofs>
; [~/]<trk>/-<ofs>
; [~/]<trk>/<msf>[-]
; [~/]<trk>/<msf>-<msf>
; [~/]<trk>/-<msf>
; [~/]<trk>.<idx>/<ofs>[-]
; [~/]<trk>.<idx>/<ofs>-<ofs>
; [~/]<trk>.<idx>/-<ofs>
; [~/]<trk>.<idx>/<msf>[-]
; [~/]<trk>.<idx>/<msf>-<msf>
; [~/]<trk>.<idx>/-<msf>
; [~/]<trk>.<idx>
; [~/]<trk>.<idx>-
; [~/]<trk>.-<idx>
; [~/]<trk>.<idx>-<idx>
; [~/]<trk>
; [~/]<trk>-
; [~/]<trk>-<trk>
; [~/]-<trk>
;
; <trk> ::= <int>
; <idx> ::= <int>
; <ofs> ::= :<int>
; <msf> ::= <int>:<int>[:<int>]
;<a0.l:文字列の先頭アドレス
;>d0.l:1=<ofs>の範囲,2=<msf>の範囲
; 0=範囲指定はない
; -1=範囲指定が不正
;>d1.l:(pl)開始トラック(省略時は$80000000),(mi)変化しない
;>d2.l:(pl)終了トラック(省略時は$7FFFFFFF),(mi)変化しない
;>d3.l:(pl)開始インデックス(省略時は$80000000),(mi)変化しない
;>d4.l:(pl)終了インデックス(省略時は$7FFFFFFF),(mi)変化しない
;>d5.l:(pl)始点(省略時は$80000000),(mi)変化しない
;>d6.l:(pl)終点(省略時は$7FFFFFFF),(mi)変化しない
;>a0.l:文字列の先頭アドレス
;>n-flag:mi=範囲指定が不正
;>z-flag:eq=範囲指定ではない
.text
.align 4,$2048
get_suffix_range_trkidx:
movem.l d1-d7/a0,-(sp)
bsr get_suffix_range_ofsmsf
bmi 99f ;エラー
sne.b d7 ;0=範囲指定がない,-1=範囲指定がある
move.l d1,d5 ;d5=始点
move.l d2,d6 ;d6=終点
move.l a0,-(sp) ;文字列の先頭
move.l d0,-(sp) ;範囲の種類
moveq.l #'/',d0 ;最後の'/'を探す
bsr strrchr
bmi @f
adda.l d0,a0 ;最後の'/'の位置
move.l a0,(4,sp) ;最後の'/'の位置
addq.l #1,a0 ;最後の'/'の直後
@@: cmpi.b #'-',(a0)
beq 37f ;先頭が'-'
bsr stou
bcs 98f ;先頭が'-'でも数字でもないのでエラー
;先頭が数字
tst.b d7
bne @f ;範囲指定があるので1トラックのみ
cmpi.b #'-',(a0)
beq 34f ;数字の直後が'-'
@@:
;数字の直後が'-'以外の文字なので1トラックのみ
move.l d0,d1 ;d1=開始トラック
move.l d0,d2 ;d2=終了トラック
move.l #$80000000,d3 ;d3=開始インデックス
move.l #$7FFFFFFF,d4 ;d4=終了インデックス
tst.b (a0)
beq 97f ;トラック指定あり,インデックスなし
cmpi.b #'.',(a0)
bne 98f ;トラック番号の直後に'.'以外の文字があるのでエラー
addq.l #1,a0
cmpi.b #'-',(a0)
beq 33f ;'.'の直後が'-'
bsr stou
bcs 98f ;'.'の直後が'-'でも数字でもないのでエラー
;'.'の直後が数字
move.l d0,d3 ;d3=開始インデックス
move.l d0,d4 ;d4=終了インデックス
tst.b d7
bne 31f ;範囲指定があるのでインデックスは1つのはず
cmpi.b #'-',(a0)
bne 31f ;インデックスは1つ
move.l #$7FFFFFFF,d4 ;d4=終了インデックス
addq.l #1,a0
tst.b (a0)
beq 97f ;終了インデックス省略
30: bsr stou
bcs 98f ;終了インデックスエラー
move.l d0,d4 ;d4=終了インデックス
cmp.l d3,d4
blt 96f ;開始インデックス>終了インデックス
31: tst.b (a0)
beq 97f ;トラック指定あり,インデックスあり
bra 98f ;インデックスの末尾がおかしい
;'.'の直後が'-'
33: move.l #$80000000,d3 ;d3=開始インデックス
addq.l #1,a0
bra 30b
;数字の直後が'-'
34: move.l #$80000000,d3 ;d3=開始インデックス
move.l #$7FFFFFFF,d4 ;d4=終了インデックス
addq.l #1,a0
tst.b (a0)
beq 36f ;数字'-'の直後に文字がないので開始のみ
move.l d0,d1 ;d1=開始トラック
bsr stou
bcs 98f ;数字'-'の直後に数字以外の文字があるのでエラー
35: move.l d0,d2 ;d2=終了トラック
cmp.l d1,d2
blt 96f ;開始トラック>終了トラック
bra 97f
;開始トラックのみ
36: move.l d0,d1 ;d1=開始トラック
move.l #$7FFFFFFF,d2 ;d2=終了トラック
97: move.l (sp)+,d0
movea.l (sp)+,a0
sf.b (a0) ;clr.b (a0)はフラグを破壊するので不可
lea.l (24,sp),sp
movem.l (sp)+,d7/a0
; tst.l d0 ;上のmove.l (sp)+,d0の結果が使えるので省略
rts
;先頭が'-'
37: tst.b d7
bne 98f ;範囲指定があるのでエラー
move.l #$80000000,d1 ;d1=開始トラック
addq.l #1,a0
bsr stou
bcs 98f ;'-'の直後に数字がないのでエラー
move.l #$80000000,d3 ;d3=開始インデックス
move.l #$7FFFFFFF,d4 ;d4=終了インデックス
tst.b (a0)
beq 35b ;'-'数字の直後に文字がないので終了のみ
;'-'数字の直後に文字があるのでエラー
98: move.l #$80000000,d1 ;d1=開始トラック
move.l #$7FFFFFFF,d2 ;d2=終了トラック
move.l #$80000000,d3 ;d3=開始インデックス
move.l #$7FFFFFFF,d4 ;d4=終了インデックス
move.l (sp)+,d0
lea.l (4+24,sp),sp
movem.l (sp)+,d7/a0
; tst.l d0 ;上のmove.l (sp)+,d0の結果が使えるので省略
rts
96: addq.l #8,sp
moveq.l #-1,d0
99: movem.l (sp)+,d1-d7/a0
tst.l d0
rts
;----------------------------------------------------------------
;文字列の末尾から<ofs>または<msf>の範囲指定を読み取って文字列から切り捨てる
; [~/]<ofs>[-]
; [~/]<ofs>-<ofs>
; [~/]-<ofs>
; [~/]<msf>[-]
; [~/]<msf>-<msf>
; [~/]-<msf>
;<a0.l:文字列の先頭アドレス
;>d0.l:1=<ofs>の範囲,2=<msf>の範囲
; 0=範囲指定はない
; -1=範囲指定が不正
;>d1.l:(pl)始点(省略時は$80000000),(mi)変化しない
;>d2.l:(pl)終点(省略時は$7FFFFFFF),(mi)変化しない
;>a0.l:文字列の先頭アドレス
;>n-flag:mi=範囲指定が不正
;>z-flag:eq=範囲指定ではない
.text
.align 4,$2048
get_suffix_range_ofsmsf:
movem.l d1-d2/a0,-(sp)
move.l a0,-(sp) ;文字列の先頭
moveq.l #'/',d0 ;最後の'/'を探す
bsr strrchr
bmi @f
adda.l d0,a0 ;最後の'/'の位置
move.l a0,(sp) ;最後の'/'の位置
addq.l #1,a0 ;最後の'/'の直後
@@: bsr get_range_ofsmsf
beq 18f ;範囲指定がない
bmi 90f ;範囲指定が不正
tst.b (a0)
bne 89f ;<NUL>で終わっていない
movea.l (sp)+,a0 ;'/'の位置('/'がないときは文字列の先頭)
sf.b (a0) ;以降を切り捨てる
addq.l #8,sp
bra 19f
18: lea.l (4+8,sp),sp
19: movea.l (sp)+,a0
tst.l d0
rts
89: moveq.l #-1,d0 ;<NUL>で終わっていない
90: addq.l #4,sp
movem.l (sp)+,d1-d2/a0
rts
;----------------------------------------------------------------
;文字列の先頭から<ofs>または<msf>の範囲指定を読み取る
; <ofs>[-]
; <ofs>-<ofs>
; -<ofs>
; <msf>[-]
; <msf>-<msf>
; -<msf>
;<a0.l:文字列の先頭アドレス
;>d0.l:1=<ofs>の範囲,2=<msf>の範囲
; 0=範囲指定ではない
; -1=範囲指定が不正
;>d1.l:(pl)始点(省略時は$80000000),(mi)変化しない
;>d2.l:(pl)終点(省略時は$7FFFFFFF),(mi)変化しない
;>a0.l:(pl)範囲指定の直後,(mi)変化しない
;>n-flag:mi=範囲指定が不正
;>z-flag:eq=範囲指定ではない
.text
.align 4,$2048
get_range_ofsmsf:
movem.l d1-d2/a0,-(sp)
move.l #$80000000,d1 ;始点($80000000=省略)
cmpi.b #'-',(a0)
beq 10f
bsr get_ofs
bpl 20f
addq.l #1,d0
bmi 91f ;<ofs>の指定が不正
bsr get_msf
bpl 30f
addq.l #1,d0
bmi 91f ;<msf>の指定が不正
;範囲指定なし
90: move.l #$7FFFFFFF,d2 ;終点($7FFFFFFF=省略)
addq.l #8,sp
movea.l (sp)+,a0
moveq.l #0,d0 ;範囲指定なし
rts
;'-'で始まっている
; -<ofs>
; -<msf>
10: addq.l #1,a0
bsr get_ofs
bpl 25f ;-<ofs>
addq.l #1,d0
bmi 91f ;<ofs>の指定が不正
bsr get_msf
bpl 35f ;-<msf>
addq.l #1,d0
bpl 90b ;'-'の直後が<ofs>,<msf>のいずれでもないので,
;範囲指定なし
;範囲指定が不正
91: movem.l (sp)+,d1-d2/a0
moveq.l #-1,d0
rts
;<ofs>で始まっている
; <ofs>[-]
; <ofs>-<ofs>
20: move.l d0,d1 ;d1=始点
move.l #$7FFFFFFF,d2 ;d2=終点($7FFFFFFF=省略)
cmpi.b #'-',(a0)
bne 29f ;'-'がないので始点のみ
;<ofs>-
addq.l #1,a0
bsr get_ofs
bpl 21f
addq.l #1,d0
bmi 91b ;<ofs>の指定が不正
bra 29f
21: cmp.l d1,d0
blt 91b ;始点>終点
25: move.l d0,d2 ;d2=終点
29: lea.l (12,sp),sp
moveq.l #1,d0 ;<ofs>の範囲
rts
;<msf>で始まっている
; <msf>[-]
; <msf>-<msf>
30: move.l d0,d1 ;d1=始点
move.l #$7FFFFFFF,d2 ;d2=終点($7FFFFFFF=省略)
cmpi.b #'-',(a0)
bne 39f ;'-'がないので始点のみ
;<msf>-
addq.l #1,a0
bsr get_msf
bpl 31f
addq.l #1,d0
bmi 91b ;<ofs>の指定が不正
bra 39f
31: cmp.l d1,d0
blt 91b ;始点>終点
35: move.l d0,d2 ;d2=終点
39: lea.l (12,sp),sp
moveq.l #2,d0 ;<msf>の範囲
rts
;----------------------------------------------------------------
;文字列の先頭から<ofs>の指定を読み取る
; :<ofs>
; ofs=0~2147483647
;<a0.l:文字列の先頭アドレス
;>d0.l:(pl)ofs(0~2147483647)
; -1=<ofs>の指定ではない
; -2=<ofs>の指定が不正
;>a0.l:(pl)<ofs>の直後,(mi)変化しない
;>n-flag:pl=<ofs>の指定があった,mi=エラー
.text
.align 4,$2048
get_ofs:
move.l a0,-(sp)
cmpi.b #':',(a0)+
bne 89f ;先頭が':'でないので<ofs>の指定ではない
bsr stoi
bcs 88f ;':'の直後に整数がない→<ofs>の指定が不正
bmi 88f ;<ofs>が負数→<ofs>の指定が不正
addq.l #4,sp
; tst.l d0
rts
;<ofs>の指定が不正
88: moveq.l #-2,d0
bra 90f
;<ofs>の指定ではない
89: moveq.l #-1,d0
90: movea.l (sp)+,a0
rts
;----------------------------------------------------------------
;文字列の先頭から<msf>の指定を読み取る
; <msf> ::= <m>:<s>[:<f>]
; データの種類に関係なくfの単位は1/75秒
; <m> ::= 0~99
; <s> ::= 0~59
; <f> ::= 0~74
;<a0.l:文字列の先頭アドレス
;>d0.l:(pl)00mmssff
; bit 31~24 0
; bit 23~16 <m> 0~99
; bit 15~8 <s> 0~59
; bit 7~0 <f> 0~74,-1=省略
; -1=<msf>の指定ではない
; -2=<msf>の指定が不正
;>a0.l:(pl)<msf>の指定の直後,(mi)変化しない
;>n-flag:pl=<msf>の指定があった,mi=エラー
.text
.align 4,$2048
get_msf:
move.l a0,-(sp)
clr.l -(sp) ;結果のワーク,最上位バイトは0
bsr stoi
bcs 89f ;先頭に<m>がないので<msf>の指定ではない
cmp.l #100,d0 ;<m>は0~99
bcc 89f ;<m>が0~99の範囲外(ここまでは不正扱いにしない)
cmpi.b #':',(a0)+
bne 89f ;<m>の直後に':'がないので<msf>の指定ではない
move.b d0,(1,sp) ;<m>
bsr stoi
bcs 88f ;':'の直後に<s>がない→<msf>の指定が不正
cmp.l #60,d0 ;<s>は0~59
bcc 88f ;<m>が0~59の範囲外→<msf>の指定が不正
move.b d0,(2,sp) ;<s>
cmpi.b #':',(a0)
bne 20f ;<s>の直後に':'がないので<f>は省略
addq.l #1,a0
bsr stoi
bcs 88f ;':'の直後に<f>がない→<msf>の指定が不正
cmp.b #75,d0 ;<f>は0~74
bcc 88f ;<f>が0~74の範囲外→<msf>の指定が不正
move.b d0,(3,sp) ;f
bra 29f
20: st.b (3,sp) ;<f>を省略したので<f>=-1
29: move.l (sp)+,d0
addq.l #4,sp
rts
;<msf>の指定が不正
88: moveq.l #-2,d0
bra 90f
;<msf>の指定ではない
89: moveq.l #-1,d0
90: addq.l #4,sp
movea.l (sp)+,a0
rts
;----------------------------------------------------------------
;----------------------------------------------------------------
;使用法を表示する
.text
.align 4,$2048
print_usage:
movem.l d0/a0,-(sp)
lea.l (m_usage,pc),a0
bra 2f
1: bsr inkey
cmp.w #$03,d0
beq 9f
cmp.w #$1B,d0
beq 9f
bsr tolower
cmp.w #'q',d0
beq 9f
2: bsr eprint
bsr strchr0
addq.l #1,a0
tst.b (a0)
bne 1b
3: movem.l (sp)+,d0/a0
rts
9: bsr crlf
bra 3b
m_usage: .dc.b '◎機能',13,10
.dc.b ' ステレオの PCM データを内蔵 OPM のみで再生します',13,10
.dc.b ' 再生できるデータ',13,10
.dc.b ' (1) PCM データが入っているファイル (.S44/.PCM/.AIF/.WAV/.FMP など)',13,10
.dc.b ' (2) CD の音声トラック (CDDA)',13,10
.dc.b ' (3) PlayStation の CDXA の圧縮音声データ (.STR/.XA/.X16/.X32 など)',13,10
.dc.b 13,10
.dc.b '◎使用法',13,10
.dc.b ' > ',PROGNAME,' [スイッチ] {ファイル名|トラック番号} …',13,10
.dc.b ' コマンドラインの前に環境変数 ',PROGNAME,' の内容を解釈します',13,10
.dc.b ' [ESC]/[Q] で終了、[CTRL+C]/[BREAK]/[INTERRUPT]/POWER OFF で強制終了できます',13,10
.dc.b ' [TAB] でスキップ、[F] でフェードアウトできます',13,10
.dc.b 13,10
.dc.b '○スイッチ',13,10
.dc.b ' チャンネル数',13,10
.dc.b ' -mono モノラル再生',13,10
.dc.b ' -stereo ステレオ再生 (デフォルト)',13,10
.dc.b ' ボリューム',13,10
.dc.b ' -v<n> ボリューム (最小=1~最大=1024) [',STR_VOLUME,']',13,10
.dc.b ' サンプリング周波数の変換方式',13,10
.dc.b ' -lq Low Quality (68000 のときデフォルト)',13,10
.dc.b ' -hq High Quality (68030 のときデフォルト)',13,10
.dc.b ' -sq Super Quality (68040/68060 のときデフォルト)',13,10
.dc.b '-more-',0,13
.dc.b 10 ;-more-を消すとき削除する
.dc.b ' 再生時のサンプリング周波数',13,10
.dc.b ' -int[=]<n> 再生時のサンプリング周波数の指定 (',STR_MIN_INT,'~',STR_MAX_INT,':割り込み間隔(μs))',13,10
.dc.b ' モノラル/ステレオ',13,10
.dc.b ' 19 … 52632Hz / 26316Hz (68060 のときデフォルト)',13,10
.dc.b ' 22 … 45455Hz / 22727Hz (68030 のときデフォルト)',13,10
.dc.b ' 23 … 43478Hz / 21739Hz (68040 のときデフォルト)',13,10
.dc.b ' 40 … 25000Hz / 12500Hz (68000 のときデフォルト)',13,10
.dc.b ' FMP ファイルを再生する場合は -int の指定は無効です',13,10
.dc.b ' フェードイン・フェードアウト',13,10
.dc.b ' -fi[[=]<n>] フェードイン速度 (最低速=1~最高速=31,[',STR_FADEIN_SPEED,']) [',STR_ATTACK_RATE,']',13,10
.dc.b ' -fo[=]<n> フェードアウト速度 (最低速=1~最高速=31) [',STR_FADEOUT_SPEED,']',13,10
.dc.b ' フェードアウトが完了すると自動的に再生が終了します',13,10
.dc.b ' フィルタ (仮実装)',13,10
.dc.b ' -bass バスブースター (低音部を強調する)',13,10
.dc.b ' -hicut ハイカットフィルタ (高周波成分を減らす)',13,10
.dc.b ' -bass と -hicut は同時に掛けられません (後から指定したほうだけ有効)',13,10
.dc.b ' -bass と -hicut は FMP/ADPCM/CDXA のデータには無効です',13,10
.dc.b ' データ変換',13,10
.dc.b ' -c <filename>[.fmp] PCM を FMP フォーマットに変換してファイルに出力する',13,10
.dc.b ' その他',13,10
.dc.b ' -loop ループ再生',13,10
.dc.b ' -b<n> PCM バッファを約 n/6 MB 確保する [',STR_BUFUNT,']',13,10
.dc.b ' -himem ハイメモリが使えればバッファをハイメモリに確保する (デフォルト)',13,10
.dc.b ' -onmem オンメモリ動作 (ディスクアクセスしながら再生しない)',13,10
.dc.b ' -tdpause TIMER-D 割り込みを Human から奪って使う (デフォルト)',13,10
.dc.b ' -silent サイレントモード (エラー以外のメッセージを表示しない)',13,10
.dc.b ' -extra 拡張操作モード (後述)',13,10
.dc.b '-more-',0,13
.dc.b 10 ;-more-を消すとき削除する
.dc.b ' 再生環境の制限 (指定された環境のときだけ再生する)',13,10
.dc.b ' -mac<n,…> 本体の制限 (0=X68000,3=X68030)',13,10
.dc.b ' -mpu<n,…> MPU の制限 (0=68000,3=68030,4=68040,6=68060)',13,10
.dc.b ' 再生環境の制限はファイル名の手前に記述する必要があります',13,10
.dc.b 13,10
.dc.b '(1) PCM データが入っているファイルを読み出して再生するとき',13,10
.dc.b ' ファイルを読み出して再生する',13,10
.dc.b ' ファイル名[/再生範囲]',13,10
.dc.b ' 指定されたファイルの指定された範囲を再生します',13,10
.dc.b ' /再生範囲 を省略した場合はファイルの先頭から末尾まで再生します',13,10
.dc.b ' 不正なオフセットを指定しないように注意して下さい',13,10
.dc.b ' (例えば拡張子が .S44 ならば 4 で割り切れるオフセットでなければならない)',13,10
.dc.b ' ファイル名にはワイルドカードが使えます',13,10
.dc.b ' ファイル名と /再生範囲 は詰めて指定して下さい',13,10
.dc.b ' 再生範囲の指定',13,10
.dc.b ' /-:N ファイルの先頭からオフセット N まで再生します',13,10
.dc.b ' /:N- オフセット N からファイルの末尾まで再生します',13,10
.dc.b ' /:N1-:N2 オフセット N1 からオフセット N2 まで再生します',13,10
.dc.b '-more-',0,13
.dc.b 10 ;-more-を消すとき削除する
.dc.b ' 拡張子による自動判別',13,10
.dc.b ' <~>.m16 モノラル,Signed-16bit,Big-endian,16000Hz',13,10
.dc.b ' <~>.m19 モノラル,Signed-16bit,Big-endian,18900Hz',13,10
.dc.b ' <~>.m22 モノラル,Signed-16bit,Big-endian,22050Hz',13,10
.dc.b ' <~>.m24 モノラル,Signed-16bit,Big-endian,24000Hz',13,10
.dc.b ' <~>.m32 モノラル,Signed-16bit,Big-endian,32000Hz',13,10
.dc.b ' <~>.m38 モノラル,Signed-16bit,Big-endian,37800Hz',13,10
.dc.b ' <~>.m44 モノラル,Signed-16bit,Big-endian,44100Hz',13,10
.dc.b ' <~>.m48 モノラル,Signed-16bit,Big-endian,48000Hz',13,10
.dc.b ' <~>.s16 ステレオ,Signed-16bit,Big-endian,16000Hz',13,10
.dc.b ' <~>.s19 ステレオ,Signed-16bit,Big-endian,18900Hz',13,10
.dc.b ' <~>.s22 ステレオ,Signed-16bit,Big-endian,22050Hz',13,10
.dc.b ' <~>.s24 ステレオ,Signed-16bit,Big-endian,24000Hz',13,10
.dc.b ' <~>.s32 ステレオ,Signed-16bit,Big-endian,32000Hz',13,10
.dc.b ' <~>.s38 ステレオ,Signed-16bit,Big-endian,37800Hz',13,10
.dc.b ' <~>.s44 ステレオ,Signed-16bit,Big-endian,44100Hz',13,10
.dc.b ' <~>.s48 ステレオ,Signed-16bit,Big-endian,48000Hz',13,10
.dc.b ' <~>.pcm モノラル,4bit-ADPCM(MSM6258V),15625Hz',13,10
.dc.b ' <~>.p16 モノラル,Signed-16bit,Big-endian,15625Hz',13,10
.dc.b ' ヘッダによる自動判別',13,10
.dc.b ' WAVE、AIFF、FMP(専用フォーマット)はヘッダで自動判別されます',13,10
.dc.b '-more-',0,13
.dc.b 10 ;-more-を消すとき削除する
.dc.b ' フォーマットの強制指定 (拡張子やヘッダを無視する)',13,10
.dc.b ' -m16 モノラル,Signed-16bit,Big-endian,16000Hz',13,10
.dc.b ' -m19 モノラル,Signed-16bit,Big-endian,18900Hz',13,10
.dc.b ' -m22 モノラル,Signed-16bit,Big-endian,22050Hz',13,10
.dc.b ' -m24 モノラル,Signed-16bit,Big-endian,24000Hz',13,10
.dc.b ' -m32 モノラル,Signed-16bit,Big-endian,32000Hz',13,10
.dc.b ' -m38 モノラル,Signed-16bit,Big-endian,37800Hz',13,10
.dc.b ' -m44 モノラル,Signed-16bit,Big-endian,44100Hz',13,10
.dc.b ' -m48 モノラル,Signed-16bit,Big-endian,48000Hz',13,10
.dc.b ' -s16 ステレオ,Signed-16bit,Big-endian,16000Hz',13,10
.dc.b ' -s19 ステレオ,Signed-16bit,Big-endian,18900Hz',13,10
.dc.b ' -s22 ステレオ,Signed-16bit,Big-endian,22050Hz',13,10
.dc.b ' -s24 ステレオ,Signed-16bit,Big-endian,24000Hz',13,10
.dc.b ' -s32 ステレオ,Signed-16bit,Big-endian,32000Hz',13,10
.dc.b ' -s38 ステレオ,Signed-16bit,Big-endian,37800Hz',13,10
.dc.b ' -s44 ステレオ,Signed-16bit,Big-endian,44100Hz',13,10
.dc.b ' -s48 ステレオ,Signed-16bit,Big-endian,48000Hz',13,10
.dc.b ' -pcm モノラル,4bit-ADPCM(MSM6258V),15625Hz',13,10
.dc.b ' -p16 モノラル,Signed-16bit,Big-endian,15625Hz',13,10
.dc.b ' -xx フォーマットの強制指定を解除する',13,10
.dc.b ' フォーマットの強制指定はファイル名の手前に記述する必要があります',13,10
.dc.b ' 標準入力の再生',13,10
.dc.b ' - 標準入力を PCM データとみなして再生する',13,10
.dc.b ' 標準入力を再生するときはフォーマットの強制指定が必要です',13,10
.dc.b '-more-',0,13
.dc.b 10 ;-more-を消すとき削除する
.dc.b '(2) CD の音声トラック (CDDA) を読み出して再生するとき',13,10
.dc.b ' トラック番号の指定',13,10
.dc.b ' N,… トラック N,… を再生する',13,10
.dc.b ' -N 最初のトラックからトラック N まで再生する',13,10
.dc.b ' N- トラック N から最後のトラックまで再生する',13,10
.dc.b ' N1-N2 トラック N1 からトラック N2 まで再生する',13,10
.dc.b ' all 最初のトラックから最後のトラックまで再生する',13,10
.if 0
.dc.b ' mm:ss:ff[-] mm:ss:ff から最後まで再生する',13,10
.dc.b ' m1:s1:f1-m2:s2:f2 m1:s1:f1 から m2:s2:f2 まで再生する',13,10
.dc.b ' n/mm:ss:ff[-] トラック n の mm:ss:ff から最後まで再生する',13,10
.dc.b ' n/m1:s1:f1-m2:s2:f2 トラック n の m1:s1:f1 から m2:s2:f2 まで再生する',13,10
.dc.b ' mm:ss:ff = mm 分 ss 秒 ff/75 秒',13,10
.endif
.dc.b ' CD-ROM ドライブの指定',13,10
.dc.b ' -id[=]<n>[,<m>] SCSI-ID=<n>[,LUN=<m>] の CD-ROM ドライブを使う',13,10
.dc.b ' -id の指定がないときは環境変数 CDROM を参照します',13,10
.dc.b ' -sony SONY 系の CDDA 転送コマンドを使う',13,10
.dc.b ' -toshiba TOSHIBA 系の CDDA 転送コマンドを使う',13,10
.dc.b ' -sony または -toshiba の指定がないときは自動判別を試みます',13,10
.dc.b ' 転送速度',13,10
.dc.b ' -normal 標準速',13,10
.dc.b ' -fast 倍速',13,10
.dc.b ' -ultra 最高速(CDU-561/CDU-55S のときデフォルト)',13,10
.dc.b ' その他',13,10
.dc.b ' -l CD のトラックの一覧表示',13,10
.dc.b ' CDC.x が常駐しているときは CD のタイトルと曲名も表示します',13,10
.dc.b ' -force メディア不良による回避できないエラーが発生しても再生を続ける',13,10
.dc.b ' -force を指定しても再生が途切れることがあります',13,10
***** .dc.b ' -soft SCSI を強制的にソフト(MPU)転送にする (デフォルト)',13,10
***** .dc.b ' -hard SCSI を強制的にハード(DMA)転送にする',13,10
.dc.b '-more-',0,13
.dc.b 10 ;-more-を消すとき削除する
.dc.b '(3) PlayStation の CDXA の圧縮音声データを読み出して再生するとき',13,10
.dc.b ' プレステソフトで拡張子が .STR/.XA/.X16/.X32 などのファイルを再生できます',13,10
.dc.b ' ファイル名[/トラック番号]',13,10
.dc.b ' 指定された CDXA ファイルの指定されたトラックを再生します (N=0~255)',13,10
.dc.b ' /トラック番号 を省略した場合はすべてのトラックを再生します',13,10
.dc.b ' ファイル名にはワイルドカードが使えます',13,10
.dc.b ' ファイル名と /トラック番号 は詰めて指定して下さい',13,10
.dc.b ' トラック番号の指定',13,10
.dc.b ' /-N 最初のトラックからトラック N まで再生する',13,10
.dc.b ' /N- トラック N から最後のトラックまで再生する',13,10
.dc.b ' /N1-N2 トラック N1 からトラック N2 まで再生する',13,10
.dc.b ' CDXA のデータを再生する場合は PCM バッファ(-b<n>)をなるべく大きく確保して下さい',13,10
.dc.b ' 拡張子の自動判別に該当するファイルと拡張子が .FMP のファイルは CDXA として再生できません',13,10
.dc.b 13,10
.dc.b '◎ FMP フォーマット (FM-PCM) について',13,10
.dc.b ' FMP フォーマットは S44PLAY.X 専用の PCM データフォーマットです',13,10
.dc.b ' サンプリング周波数、ボリューム、PCM→OPM 変換済みなので再生処理が軽くなります',13,10
.dc.b ' リアルタイム変換では処理が間に合わない場合、PCM データをあらかじめ FMP フォー',13,10
.dc.b ' マットに変換しておくと再生できる場合があります',13,10
.dc.b 13,10
.dc.b '◎拡張操作モード',13,10
.dc.b ' スイッチ -extra を指定すると拡張操作モードになります',13,10
.dc.b ' 拡張操作モードでは、キー、パッド、マウスのボタン操作でフェードアウトします',13,10
.dc.b ' フェードアウトが完了すると自動的に再生が終了します',13,10
.dc.b ' 拡張操作モードでも '
.if TEST_ESC
.dc.b '[ESC] で終了、'
.endif
.if TEST_BREAK
.dc.b '[BREAK]/'
.endif
.dc.b '[INTERRUPT]/POWER OFF で強制終了できます',13,10
.dc.b ' 拡張操作モードでは TIMER-A 割り込みを使います',13,10
.dc.b ' TIMER-A 割り込みが使用中のときは拡張操作モードは使えません',13,10
.dc.b '-more-',0,13
.dc.b 10 ;-more-を消すとき削除する
.dc.b '◎注意事項',13,10
.dc.b ' データを変換しながらの再生には 68030 以上の MPU が必要です',13,10
.dc.b ' フィルタを掛けながらリアルタイムに再生するには 68040 以上の MPU が必要です',13,10
.dc.b ' CDXA の圧縮音声データのリアルタイム再生には 68060 以上の MPU が必要です',13,10
.dc.b ' CD の音声トラックを読みながらの再生には 2 倍速以上で取り込めるドライブが必要です',13,10
.dc.b ' 音源ドライバ類をすべて解除してから実行して下さい',13,10
.dc.b ' 水平同期割り込みを使用する常駐ソフトウェアはすべて解除して下さい',13,10
.dc.b ' 垂直同期割り込みを使用する常駐ソフトウェアもなるべく解除して下さい',13,10
.dc.b ' TIMER-C と TIMER-D を使います',13,10
.dc.b ' 拡張操作モードでは TIMER-A 割り込みも使います',13,10
.if TEST_DEBUG_SWITCH_HELP
.dc.b 13,10
.dc.b '[debug switch]',13,10
.dc.b ' -debug debug mode',13,10
.dc.b ' -debugb=<n> BEFORE_TIMERC source',13,10
.dc.b ' -debugm=<n> MUTE_DELAY source',13,10
.dc.b ' -debugp=<n> PLAY_INTERVAL source',13,10
.dc.b ' -debugs=<n> STANDBY_DELAY source',13,10
.endif
.dc.b 0,0
.even